package com.beta.cat.config.clickhouse;

import lombok.extern.slf4j.Slf4j;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;
import java.util.List;
import java.util.Map;

@Slf4j
public class ClickhouseService {
    private final JdbcTemplate jdbcTemplate;

    public ClickhouseService(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    /**
     * 返回当前数据源的JdbcTemplate实体类，对外可以提供更多操作方法
     */
    public JdbcTemplate getJdbcTemplate() {
        return this.jdbcTemplate;
    }

    /**
     * 查询SQL中的列表数据
     *
     * @param sql 要执行的SQL
     * @return 结果列表
     */
    public List<Map<String, Object>> queryList(String sql, Object... args) {
        return jdbcTemplate.queryForList(sql, args);
    }

    /**
     * 查询SQL列表，并返回成包装好的实体类
     *
     * @param entityClass 返回的实体类
     * @param sql         要执行的SQL
     * @param args        SQL中的变量
     * @param <T>         返回的实体类型
     * @return 以对象方式返回实体类
     */
    public <T> List<T> queryList(Class<T> entityClass, String sql, Object... args) {
        return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(entityClass), args);
    }

    /**
     * 查询SQL中的列表数据
     *
     * @param sql      查询的SQL
     * @param pageNo   第几页，从1开始
     * @param pageSize 每页条数
     * @param args     SQL中的参数
     * @return 返回结果
     */
    public List<Map<String, Object>> queryList(String sql, int pageNo, int pageSize, Object... args) {
        return jdbcTemplate.queryForList(buildPageSql(sql, pageNo, pageSize), args);
    }

    /**
     * 查询SQL中的列表数据
     *
     * @param sql      查询的SQL
     * @param pageNo   第几页，从1开始
     * @param pageSize 每页条数
     * @param args     SQL中的参数
     * @return 返回结果
     */
    public <T> List<T> queryList(Class<T> entityClass, String sql, int pageNo, int pageSize, Object... args) {
        return jdbcTemplate.query(buildPageSql(sql, pageNo, pageSize), new BeanPropertyRowMapper<>(entityClass), args);
    }


    private String buildPageSql(String sql, int pageNo, int pageSize) {
        if (pageNo < 1) {
            pageNo = 1;
        }
        if (pageSize < 1) {
            pageSize = 20;
        }
        return sql + " limit " + ((pageNo - 1) * pageSize) + "," + pageSize;
    }

}
